import axios from 'axios';
import {Message, MessageBox} from 'element-ui'

const token = localStorage.getItem('token') || "X";

const REQUEST_CONFIG = {
    baseURL: process.env.VUE_BASE_URL,
    timeout: 1000,
}

const pendingRequestMap = new Map();

const AxiosInstance = axios.create(REQUEST_CONFIG);

AxiosInstance.interceptors.request.use((config) => {
    const {headers, url, params, method, data} = config;

    const requestOfStr = method + url + JSON.stringify(params) + JSON.stringify(data);

    if (pendingRequestMap.has(requestOfStr)) {
        const controller = pendingRequestMap.get(requestOfStr);
        controller && controller.abort();
        pendingRequestMap.delete(requestOfStr);
    } else {
        const controller = new AbortController();
        config.signal = controller.signal;
        pendingRequestMap.set(requestOfStr, controller);
    }

    if (!headers) {
        config.headers.Authorization = 'Bearer ' + token;
    }

    return config;
}, (error) => {
    return Promise.reject(error);
})


AxiosInstance.interceptors.response.use((response) => {
        /**
         * code为非20000是抛错 可结合自己业务进行修改
         */
        const res = response.data

        if (res.code !== 20000) {
            Message({
                message: res.data,
                type: 'error',
                duration: 5 * 1000
            })

            // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
            if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
                MessageBox.confirm(
                    '你已被登出，可以取消继续留在该页面，或者重新登录',
                    '确定登出',
                    {
                        confirmButtonText: '重新登录',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }
                ).then(() => {
                    // store.dispatch('FedLogOut').then(() => {
                    //     location.reload() // 为了重新实例化vue-router对象 避免bug
                    // })
                })
            }
            return Promise.reject('error')
        } else {
            // console.log("response",res)
            return res.data
        }

    }, (error) => {
        console.log('err' + error) // for debug
        Message({
            message: error.message,
            type: 'error',
            duration: 5 * 1000
        })
        return Promise.reject(error)
    }
)

export default AxiosInstance;
